package com.czh.utils;

import com.czh.entity.RpcRequest;
import com.czh.entity.RpcResponse;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

/**
 * @author chenzhihua
 * @desc TODO
 * @date 2024/1/9
 * @Version V1.1.0
 */
public class IoClient {
    /**
     * 这里负责底层与服务端的通信，发送的Request，接受的是Response对象
     * 客户端发起一次请求调用，Socket建立连接，发起请求Request，得到响应Response
     * 这里的request是封装好的（上层进行封装），不同的service需要进行不同的封装， 客户端只知道Service接口，需要一层动态代理根据反射封装不同的Service
     *
     * @param host
     * @param port
     * @param request
     * @return
     */
    public static RpcResponse sendRequest(String host, int port, RpcRequest request) {
        try (Socket socket = new Socket(host, port)) {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());

            System.out.println(request);
            objectOutputStream.writeObject(request);
            objectOutputStream.flush();
            RpcResponse rpcResponse = (RpcResponse) objectInputStream.readObject();
            return rpcResponse;
        } catch (Exception e) {
            System.out.println("客户端连接失败");
            return null;
        }
    }
}
